# 打印5行的三角形
# 打印7行的三角形
# 打印9行的三角形
# for n in range(5):
#     # 循环每行中的*
#     for i in range(n+1):
#         print("*", end=" ")
#     print()
# for n in range(7):
#     # 循环每行中的*
#     for i in range(n+1):
#         print("*", end=" ")
#     print()
# for n in range(9):
#     # 循环每行中的*
#     for i in range(n+1):
#         print("*", end=" ")
#     print()

# 函数
# def test(num):
#     for n in range(num):
#         # 循环每行中的*
#         for i in range(n + 1):
#             print("*", end=" ")
#         print()
#
# test(5)
# test(7)
# test(9)

# 函数是一段完整代码，可以解决一个事情，函数可以有参数和返回值
# 使用函数可以实现代码的复用

# 调用函数
# [对象或类.]函数名([实际参数])   []部分可以省略
# 形式参数：定义函数时设计的参数
# 实际参数：调用函数时传递的参数
# 调用时的实际参数要保证数据类型符合设计时的形式参数


# 直接使用
# 系统函数可以直接使用
# 如print() input()


# 通过对象或类调用
# import random
# random.randint()

# 定义函数：
# def 函数名(参数列表):
#       函数体
#       return 返回值


#
import math

# 绝对值
print(abs(-3))
# 四舍五入
print(round(3.5))
# 向上取整
print(math.ceil(3.1))
# 向下取整
print(math.floor(1.9))
# 次幂
print(math.pow(3, 2))
# 对数
print(math.log(8, 2))
print(math.log10(100))
# 开平方
print(math.sqrt(49))


# 自定义函数
# 根据有没有参数和返回值，将函数分为四类
# 无参数无返回值
def fn():
    print("这是一个无参数无返回值的函数")


fn()


# 有参数无返回值
def say_hello(name):
    print(f"你好：{name}")


say_hello("张明")

# 无参数有返回值
import random


def get_nums():
    list = []
    for i in range(5):
        list.append(random.randint(1, 10))
    return list, len(list)


# python中可以让函数返回多个返回值
# 接收有多个返回值的函数时，可以用对应数量的变量接收
# 如果用一个变量接收，会将返回值保存到一个元组中
list, len = get_nums()
print(list, len)


# res = get_nums()
# print(res)  # res是一个元组


# 有参数有返回值
def say_hello(name, sex):
    str = "先生" if sex == "男" else '女士'
    return f"你好{name}{str}"


str = say_hello("王海", "男")
print(str)


# 定义函数实现如下功能：输入一个数,输出从1到这个数的阶乘之和
# 如5,输出5!+4!+3!+2!+1!

# 5! = 5*4*3*2*1
def factorial_sum(num):
    # 阶乘和
    total = 0
    # 每个数的阶乘
    x = 1
    for i in range(1, num + 1):
        # 每个数的阶乘
        x *= i
        # 当前的阶乘和
        total += x
    return total


res = factorial_sum(int(input("请输入一个数")))
print(res)

# 极简版
import math

# sum(操作 for 变量 in 序列)
print(sum(math.factorial(i) for i in range(1, int(input("请输入一个数：")) + 1)))


# 猴子吃桃
# 猴子摘了一些桃子，每天都是吃了一半多一个，第十天吃完最后一个。
# 定义函数计算一开始多少个
# 1 4 10 22 46 94 190 382 766 1534
def test(day):
    peach = 1
    # 从最后一天倒数到第一天
    for i in range(1, day):
        # 每天都是(在现有的基础上+1)*2
        peach = (peach + 1) * 2
    return peach


print(test(10))


